import jwt from 'jsonwebtoken';
import asyncHandler from 'express-async-handler';
import User from '../models/userModel.js';

/**
 * 保护路由的中间件函数，用于验证用户请求的合法性
 */
const protect = asyncHandler(async (req, res, next) => {
  let token;

  // 尝试从请求头部获取JWT token
  if (
    req.headers.authorization &&
    req.headers.authorization.startsWith('Bearer')
  ) {
    token = req.headers.authorization.split(' ')[1];
  } else if (req.cookies && req.cookies.jwt) {
    // 如果头部没有token，尝试从cookies中获取JWT token
    token = req.cookies.jwt;
  }

  // 如果没有找到token，返回401状态码，并抛出错误
  if (!token) {
    res.status(401);
    throw new Error('Not authorized, no token');
  }

  try {
    // 验证JWT token的有效性
    const decoded = jwt.verify(token, process.env.JWT_SECRET);

    // 根据token中的用户ID查找用户信息，并排除密码字段
    req.user = await User.findById(decoded.id).select('-password');

    // 如果用户不存在，返回401状态码，并抛出错误
    if (!req.user) {
      res.status(401);
      throw new Error('Not authorized, user not found');
    }

    // 用户验证成功，继续执行下一个中间件函数
    next();
  } catch (error) {
    // token验证失败，记录错误日志，返回401状态码，并抛出错误
    console.error('Failed to authenticate token:', error);
    res.status(401);
    throw new Error('Not authorized, token failed');
  }
});


export { protect };
